package com.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

public class FileUtil
{
	public static Logger logger = Logger.getLogger("FileUtil.java");

	public static String getExtension(String fileStr)
	{
		return fileStr.substring(fileStr.lastIndexOf(".")+1,fileStr.length());
	}

	/**
	 * 다중 파일 업로드
	 *
	 * @param request
	 * @return
	 */
	@SuppressWarnings("resource")
	public static Map<String, Map<String, String>> doMultiFileUpLoad(HttpServletRequest request, String filePath, String urlPath)
	{
		logger.info("다중파일 업로드 실행");

		SimpleDateFormat sdf = new SimpleDateFormat ( "yyyyMM", Locale.KOREA );
		Date currentTime = new Date ( );
		String upday = sdf.format ( currentTime );
		filePath = filePath + File.separator + upday + File.separator;
		urlPath = urlPath + "/" + upday + "/";

		long maxFileSize = 0;
		String forbidFileType = "|EXE|HTML|HTML|JS|JSP|ASP|PHP|CAP|XML|XHTML|exe|html|html|js|jsp|asp|php|cap|xml|xhtml|";

		maxFileSize = 1024 * 1024 * 100; //100MB

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		Iterator<String> iterator = multipartRequest.getFileNames();

		Map<String, Map<String, String>> fileInfoMap = new HashMap<String, Map<String, String>>();

		while (iterator.hasNext())
		{
			Map<String, MultipartFile> multipartFileMap = multipartRequest.getFileMap();
			String fileParameterName = iterator.next();
			MultipartFile multipartFile = multipartFileMap.get(fileParameterName);
			if(multipartFile.getSize() <= 0)
				continue;

	        //파일확장자
	        String fileExt = UtilCommon.getFileExt(multipartFile.getOriginalFilename()).toLowerCase();

			// 파일 이름을 ReName함
			// sys_id
	        StringBuffer fileReName = new StringBuffer();
	        if (fileExt.equals("jpg") || fileExt.equals("gif") || fileExt.equals("png"))
	      	{
		        fileReName.append( UtilCommon.idMake("F") )
	        	.append(".")
	        	.append( fileExt );
	      	}
	        else
		        fileReName.append( UtilCommon.idMake("F") );

	        try
			{
		        //업로드 금지파일 체크
	        	if(forbidFileType.indexOf(fileExt.toUpperCase())>-1)
	        	{
	        		logger.debug(multipartFile.getOriginalFilename() + "은 업로드 할 수 없는 파일형식입니다.");
					return null;
	        	}

	        	if(multipartFile.getSize()>maxFileSize)
	        	{
					logger.debug(multipartFile.getOriginalFilename() + "이 지정된 크기("+ UtilCommon.addComma(new Long(maxFileSize)) +"byte)를 초과합니다.");
					return null;
				}
				else
				{

					if (!multipartFile.isEmpty())
					{
						InputStream is;
						is = multipartFile.getInputStream();
						File directory = new File(filePath);
						if (!directory.exists())
						{
							directory.mkdirs();
						}

						OutputStream os = new FileOutputStream(filePath + fileReName.toString());
						int readBytes = 0;
						byte[] buffer = new byte[8192];
						while ((readBytes = is.read(buffer, 0, 8192)) != -1)
						{
							os.write(buffer, 0, readBytes);
						}
						os.close();
					}

					Map<String, String> fileMap = new HashMap<String, String>();
					// input 필드명
					fileMap.put("FIELDNAME", fileParameterName);
					// 원본파일명
					fileMap.put("FILENAME", multipartFile.getOriginalFilename());
					// 파일형식
					fileMap.put("FILETYPE", UtilCommon.getFileExt(multipartFile.getOriginalFilename()));
					// 파일크기
					fileMap.put("FILESIZE", String.valueOf(multipartFile.getSize()));
					// 서버상의 저장된 물리적경로
					fileMap.put("FILEPATH", filePath);
					// 저장된 실제 파일명
					fileMap.put("FILERENAME", fileReName.toString());
					// 웹경로
					fileMap.put("FILEURLPATH", urlPath);
					fileInfoMap.put(multipartFile.getOriginalFilename(), fileMap);
				}
			}
			catch (IOException e)
			{
				e.printStackTrace();
				logger.error(e.getMessage());
				logger.info("다중파일 업로드 에러");
				return null;
			}
		}
		return fileInfoMap;
	}

	/**
	 * 다중 파일 삭제
	 */
	public static void doMulitFileDelete(String filePath){

		File file = new File(filePath);
		if(file.exists())
		{
			if(file.delete())
			{
				logger.info("첨부파일 삭제");
			}else
			{
				logger.info("첨부파일 삭제 에러");
			};
		}// end if
	}
}
